/**
 * 在这里定义和用户相关的路由处理函数，供 /router/user.js 模块进行调用；用return res.cc(err)处理返回结果的错误信息。
 */

const db = require('../db/index')
const bcrypt = require('bcryptjs')  //加密
const jwt = require('jsonwebtoken') // 用这个包来生成 Token 字符串

// 导入配置文件
const config = require('../config')


// 注册用户的处理函数   post  /api/reguser
exports.regUser = (req, res) => {
  // 接收表单数据
  const userinfo = req.body
/*   // 1th、判断数据是否合法（不用这个方法，用 joi验证规则： /schema/user.js和 /router/user.js ）
  if (!userinfo.username || !userinfo.password) {
    return res.send({ status: 1, message: '用户名或密码不能为空！' })
  } */

  //2th、定义 SQL 语句：查询用户名是否被占用
  const sql = `select * from ev_users where username=?`;
  db.query(sql, [userinfo.username], function (err, results) {
  // 执行 SQL 语句失败
    if (err) { 
    //return res.send({ status: 1, message: err.message })
    return res.cc(err)
    }
  // 用户名被占用
    if (results.length > 0) {
    //return res.send({ status: 1, message: '用户名被占用，请更换其他用户名！' })
    return res.cc('用户名被占用，请更换其他用户名！')
    }
  // TODO: 用户名可用，继续后续流程...


})

      // 3th、对用户的密码,进行 bcrype 加密，返回值是加密之后的密码字符串
      //console.log(userinfo.password)
      userinfo.password = bcrypt.hashSync(userinfo.password, 10)
      //console.log(userinfo.password)

   //4th、插入用户到数据库里；调用db.query执行sq语句。
   const addsql = 'insert into ev_users set username=?,password=?'
   db.query(addsql, [userinfo.username, userinfo.password ], function (err, results) {
    //console.log(userinfo.password) //加密后的密码

    // 执行 SQL 语句失败
    //if (err) return res.send({ status: 1, message: err.message })
    if (err) return res.cc(err)

    // SQL 语句执行成功，但影响行数不为 1
   /*  if (results.affectedRows !== 1) {
      return res.send({ status: 1, message: '注册用户失败，请稍后再试！' })
    } */

    if (results.affectedRows !== 1) {
      return res.cc('注册用户失败，请稍后再试！')
    }

    // 注册成功
    res.send({ status: 0, message: '注册成功！',userinfo })
  })
 
  //res.send('reguser OK')
}

// 登录的处理函数   post    /api/login
exports.login = (req, res) => {
  //res.send('login OK')

  //接收表单数据：
  const userinfo = req.body
  //定义 SQL 语句：
  const selectsql = `select * from ev_users where username=?`
  //1th、执行 SQL 语句，查询用户的数据是否存在：
  db.query(selectsql, userinfo.username, function (err, results) {
    //console.log(results)
    // 执行 SQL 语句失败
    if (err) return res.cc(err)
    // 执行 SQL 语句成功，但是查询到数据条数不等于 1
    if (results.length !== 1) return res.cc('登录失败！')

    
    // 2th、判断用户输入的登录密码是否和数据库中的密码一致
    //res.send('login OK')
    // 拿着用户输入的密码,和数据库中存储的加密密码进行对比
      const compareResult = bcrypt.compareSync(userinfo.password, results[0].password) //取查询结果（这里是数组）的第一条的密码
      console.log(userinfo.password)
      console.log(results[0].password)

      // 如果对比的结果等于 false, 则证明用户输入的密码错误
      if (!compareResult) {
        return res.cc('登录失败！')
      }

      

      // 3、：登录成功，生成 Token 字符串
      /* 
        result格式：
        [
          RowDataPacket {
            id: 11,
            username: '121781',
            password: '200000',
            nickname: null,
            email: null,
            user_pic: null
          }
        ]      
      */
      // 剔除完毕之后，user 中只保留了用户的 id, username, nickname, email 这四个属性的值
      const user = { ...results[0], password: '', user_pic: '' }
      //console.log(user)

      // 将用户信息对象加密成 Token 字符串，生成 Token 字符串
      const tokenStr = jwt.sign(user, config.jwtSecretKey, {
        expiresIn:  config.expiresIn, // token 有效期为 10 个小时
      })
      //console.log(tokenStr)  
      
      //将生成的 Token 字符串响应给客户端：(req.auth.name)
      res.send({
        status: 0,
        message: '登录成功！',
        // 为了方便客户端使用 Token，在服务器端直接拼接上 Bearer 的前缀
        token: 'Bearer ' + tokenStr,
    })
  })
    


      

}